/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package asfabdesk.dominio;

/**
 *
 * @author Marco Aurélio
 */
import java.io.PrintStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import org.joda.time.DateTime;

public class DataUtil {

    public static String formatar(DateTime data, String formato) {
        return toString(data, formato);
    }

    public DataUtil() {
    }

    public static DateTime getPrimeiroDiaMes(DateTime hoje) {
        return new DateTime(hoje.getYear(), hoje.getMonthOfYear(), 1, 0, 0, 0, 0);
    }

    public static DateTime getPrimeiroDiaMes() {
        return getPrimeiroDiaMes(hoje());
    }

    public static DateTime getUltimoDiaMes(DateTime hoje) {
        return hoje.getMonthOfYear() >= 12 ? new DateTime(hoje.getYear(), 12, 31, 0, 0, 0, 0) : (new DateTime(hoje.getYear(), hoje.getMonthOfYear() + 1, 1, 0, 0, 0, 0)).minusDays(1);
    }

    public static DateTime getUltimoDiaMes() {
        return getUltimoDiaMes(hoje());
    }

    public static String escreverContagem(int dias) {
        if (dias == 0) {
            return "hoje";
        }
        if (dias == 1) {
            return "amanh\343";
        }
        if (dias == -1) {
            return "ontem";
        } else {
            return (new StringBuilder()).append(dias).append(" dias").toString();
        }
    }

    public static int getDiferencaEmDias(DateTime data) {
        return getDiferencaEmDias(data, hoje());
    }

    public static int getDiferencaEmDias(DateTime data2, DateTime data1) {
        if (data1 == null) {
            data1 = new DateTime();
        }
        if (data2 == null) {
            data2 = new DateTime();
        }
        return getDiferencaEmDias(data2.getMillis(), data1.getMillis());
    }

    public static int getDiferencaEmDias(Calendar data2, Calendar data1) {
        return getDiferencaEmDias(data2.getTimeInMillis(), data1.getTimeInMillis());
    }

    public static int getDiferencaEmDias(long data2, long data1) {
        return (int) ((double) (data2 - data1) / 1000D / 60D / 60D / 24D);
    }

    public static double getDiferencaEmMeses(DateTime data2, DateTime data1) {
        double diferenca = (double) (data2.getMillis() - data1.getMillis()) / 1000D / 60D / 60D / 24D / 30D;
        return diferenca;
    }

    public static Date getDate(Object data) {
        return getDate(getMillis(data));
    }

    public static Date getDate(long millis) {
        return millis >= 0L ? new Date(millis) : null;
    }

    public static Date getDate(Calendar data) {
        return getDate(getMillis(data));
    }

    public static Date getDate(DateTime data) {
        return getDate(getMillis(data));
    }

    public static Calendar getCalendar() {
        return Calendar.getInstance();
    }

    public static Calendar getCalendar(Object data) {
        return getCalendar(getMillis(data));
    }

    public static Calendar getCalendar(long millis) {
        Calendar calendar = null;
        if (millis >= 0L) {
            calendar = getCalendar();
            calendar.setTimeInMillis(millis);
        }
        return calendar;
    }

    public static Calendar getCalendar(Date data) {
        return getCalendar(getMillis(data));
    }

    public static Calendar getCalendar(DateTime data) {
        return getCalendar(getMillis(data));
    }

    public static DateTime getDateTime(Object data) {
        return getDateTime(getMillis(data));
    }

    public static DateTime getDateTime(long millis) {
        return millis >= 0L ? new DateTime(millis) : null;
    }

    public static DateTime getDateTime(Calendar data) {
        return getDateTime(getMillis(data));
    }

    public static DateTime getDateTime(Date data) {
        return getDateTime(getMillis(data));
    }

    public static long getMillis(Object data) {
        if (data != null) {
            if (data instanceof Date) {
                return getMillis((Date) data);
            }
            if (data instanceof Calendar) {
                return getMillis((Calendar) data);
            }
            if (data instanceof DateTime) {
                return getMillis((DateTime) data);
            }
            if (data instanceof String) {
                long milisegundos = -1L;
                if (data != null) {
                    String separador = null;
                    String stringData = (String) data;
                    int i = 0;
                    do {
                        if (i >= stringData.toCharArray().length) {
                            break;
                        }
                        char c = stringData.toCharArray()[i];
                        if (c == '-') {
                            separador = "-";
                            break;
                        }
                        if (c == '.') {
                            separador = ".";
                            break;
                        }
                        if (c == '/') {
                            separador = "/";
                            break;
                        }
                        i++;
                    } while (true);
                    if (separador != null) {
                        try {
                            if (stringData.length() <= 8) {
                                milisegundos = (new SimpleDateFormat((new StringBuilder()).append("dd").append(separador).append("MM").append(separador).append("yy").toString())).parse(stringData).getTime();
                            } else {
                                milisegundos = (new SimpleDateFormat((new StringBuilder()).append("dd").append(separador).append("MM").append(separador).append("yyyy").toString())).parse(stringData).getTime();
                            }
                        } catch (ParseException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
                return milisegundos;
            }
        }
        return -1L;
    }

    public static void main(String args[]) {
        System.out.println(getDateTime("20-05-1990"));
        System.out.println(getDateTime("80.05.2004"));
        System.out.println(getDateTime("08/12/2008"));
        System.out.println(getDateTime("20/14/2008"));
        System.out.println(getDateTime("20/14/10"));
        System.out.println(getDateTime("20/06/08"));
    }

    public static long getMillis(Calendar data) {
        return data != null ? data.getTimeInMillis() : -1L;
    }

    public static long getMillis(Date data) {
        return data != null ? data.getTime() : -1L;
    }

    public static long getMillis(DateTime data) {
        return data != null ? data.getMillis() : -1L;
    }

    public static String toString(Date data) {
        return toString(data, "dd/MM/yy");
    }

    public static String toString(Date data, String modelo) {
        if (data != null && modelo != null) {
            return (new SimpleDateFormat(modelo)).format(data);
        } else {
            return "";
        }
    }

    public static String toString(Calendar data) {
        return toString(data, "dd/MM/yy");
    }

    public static String toString(Calendar data, String modelo) {
        return toString(getDate(data), modelo);
    }

    public static String toString(DateTime data) {
        return toString(data, "dd/MM/yy");
    }

    public static String toString(DateTime data, String modelo) {
        return toString(getDate(data), modelo);
    }

    public static String escreverMes(Date data) {
        return escreverMes(getCalendar(data));
    }

    public static String escreverMes(Calendar data) {
        switch (data.get(2)) {
            case 0: // '\0'
                return "Janeiro";

            case 1: // '\001'
                return "Fevereiro";

            case 2: // '\002'
                return "Mar\347o";

            case 3: // '\003'
                return "Abril";

            case 4: // '\004'
                return "Maio";

            case 5: // '\005'
                return "Junho";

            case 6: // '\006'
                return "Julho";

            case 7: // '\007'
                return "Agosto";

            case 8: // '\b'
                return "Setembro";

            case 9: // '\t'
                return "Outubro";

            case 10: // '\n'
                return "Novembro";

            case 11: // '\013'
                return "Dezembro";
        }
        return null;
    }

    public static int escreverMesNumerado(Calendar data) {
        switch (data.get(2)) {
            case 0: // '\0'
                return 01;

            case 1: // '\001'
                return 02;

            case 2: // '\002'
                return 03;

            case 3: // '\003'
                return 04;

            case 4: // '\004'
                return 05;

            case 5: // '\005'
                return 06;

            case 6: // '\006'
                return 07;

            case 7: // '\007'
                return 8;

            case 8: // '\b'
                return 9;

            case 9: // '\t'
                return 10;

            case 10: // '\n'
                return 11;

            case 11: // '\013'
                return 12;
        }
        return 0;
    }

    public static String escreverMes(DateTime data) {
        return escreverMes(getCalendar(data));
    }

    public static String escreverMesNumerado(Date data) {
        return escreverMes(getCalendar(data));
    }

    public static String escreverDiaDaSemana(Date dia) {
        return escreverDiaDaSemana(getCalendar(dia));
    }

    public static String escreverDiaDaSemana(Calendar dia) {
        switch (dia.get(7)) {
            case 1: // '\001'
                return "Domingo";

            case 2: // '\002'
                return "Segunda-Feira";

            case 3: // '\003'
                return "Ter\347a-Feira";

            case 4: // '\004'
                return "Quarta-Feira";

            case 5: // '\005'
                return "Quinta-Feira";

            case 6: // '\006'
                return "Sexta-Feira";

            case 7: // '\007'
                return "S\341bado";
        }
        return null;
    }

    public static String escreverDiaDaSemana(DateTime dia) {
        return escreverDiaDaSemana(getDate(dia));
    }

    public static String escreverDiaDaSemana() {
        return escreverDiaDaSemana(new Date());
    }

    public static DateTime agora() {
        return new DateTime();
    }

    public static DateTime hoje(DateTime data) {
        DateTime hoje = new DateTime(data.getYear(), data.getMonthOfYear(), data.getDayOfMonth(), 0, 0, 0, 0);
        return hoje;
    }

    public static DateTime hoje() {
        return hoje(agora());
    }

    public static List getIntervaloDatas(Date dataInicio, Date dataTermino, boolean aplainar) {
        return getIntervaloDatas(new DateTime(dataInicio.getTime()), new DateTime(dataTermino.getTime()), aplainar);
    }

    public static List getIntervaloDatas(Calendar dataInicio, Calendar dataTermino, boolean aplainar) {
        return getIntervaloDatas(new DateTime(dataInicio.getTimeInMillis()), new DateTime(dataTermino.getTimeInMillis()), aplainar);
    }

    public static List getIntervaloDatas(DateTime dataInicio, DateTime dataTermino, boolean aplainar) {
        List intervalo = new ArrayList();
        DateTime data1 = new DateTime(dataInicio.getMillis());
        DateTime data2 = new DateTime(dataTermino.getMillis());
        if (data1 == null || data2 == null) {
            return intervalo;
        }
        for (; dataInicio.isBefore(dataTermino); dataInicio = dataInicio.plusDays(1)) {
            DateTime dataAux = new DateTime(dataInicio.getMillis());
            intervalo.add(aplainar ? ((Object) (hoje(dataAux))) : ((Object) (dataAux)));
        }

        return intervalo;
    }

    public static int compararData(DateTime data1, DateTime data2) {
        if (data1.getYear() > data2.getYear()) {
            return 1;
        }
        if (data1.getYear() < data2.getYear()) {
            return -1;
        }
        if (data1.getDayOfYear() > data2.getDayOfYear()) {
            return 1;
        }
        return data1.getDayOfYear() >= data2.getDayOfYear() ? 0 : -1;
    }

    public static boolean compararDia(DateTime data1, DateTime data2) {
        return data1.getYear() == data2.getYear() && data1.getDayOfYear() == data2.getDayOfYear();
    }

    public static String escreverDataEHora(DateTime data) {
        return toString(data, "dd/MM/yy HH:mm");
    }
    public static final String modeloPadrao = "dd/MM/yy";
}
